const ws = require("nodejs-websocket")
const PORT = 3000
const TYPE_ENTER = 0
const TYPE_LEAVE = 1
const TYPE_MSG = 2
let count = 0

/* 分析
    消息不应该是简单的字符串
    这个消息应该是一个对象
    type: 0表示进入聊天室的消息、1表示离开聊天室的消息、2表示正常聊天消息
    msg: 消息内容
    time: 消息发出时间
*/

const server = ws.createServer(function(conn){
    console.log("有用户连上了")
    count ++
    conn.username = `用户${count}`
    broadcast({
        type: TYPE_ENTER,
        msg: `${conn.username}进入了聊天室`,
        time: new Date().toLocaleTimeString()
    })

    conn.on("text", data => {
        broadcast({
            type: TYPE_MSG,
            msg: `${conn.username}:`+ "&nbsp;" + data,
            time: new Date().toLocaleTimeString()
        })
    })

    conn.on("close", () => {
        console.log("有用户离开了聊天室")
        count --
        broadcast({
            type: TYPE_LEAVE,
            msg: `${conn.username}离开了聊天室`,
            time: new Date().toLocaleTimeString()
        })
    })

    conn.on("error", () => {
        console.log("异常!")
    })
})


function broadcast(msg) {
	server.connections.forEach(item => {
        // send方法只允许参数为字符串，而现在传的是对象，所以要把对象转换为JSON字符串
		item.send(JSON.stringify(msg))
	})
}

server.listen(PORT, () => {
    console.log("websocket服务启动成功，监听端口：" + PORT)
})